# 列表list
# 有序，每个元素可以重复，类型可以不唯一，可变，查找速度会随着元素的增多而变慢
# 定义
list1 = [1, 2, 3, 4, 5]
print(list1, type(list1))

# 存5位同学的成绩
# 100 90 99 98 85
# 第一种方式：定义5个变量接收五个成绩
int1 = 100
int2 = 90
int3 = 99
int4 = 98
int5 = 85

# 第二种方式：使用list进行存储
# list 一般用于存储同类型的数据
score_list = [100, 90, 99, 98, 85]
# 在Python中也可以存储不同类型的数据
list2 = [100, 1.1, "abcd", False, None]

# 取list中的元素
# 通过index去取list中的元素
# index 从0开始
# 99
# list是有序的
print(score_list[2])

# 增加一个成绩
# list中的元素可以重复
score_list.append(60)
score_list.append(60)

print(score_list)

# 删除一个元素
# pop() 返回list中最后一个元素
score_list.pop()
print(score_list)
# 指定一个list中的元素 进行删除
score_list.remove(60)
print(score_list)

# 查找元素
# index() 指定需要查找的元素 如果找到 那么会返回该元素的index
# 如果元素不存在 那么直接抛出异常
print(score_list.index(90))
# print(score_list.index(20))

# 修改某一个元素
# list 是可变的
score_list[score_list.index(100)] = 97
print(score_list)

# 切片
# list2[起始位置:结束位置:步长]
list2 = [1, 2, 3, 4, 5, 6, 7]

# 2，3，4，5
print(list2[1:5:1])

# 1,3,5,7
print(list2[0:7:2])

# 7
print(list2[6])
# 负的索引 表示从右往左数第几个元素
print(list2[-1])

# 1,2,3,4,5,6,7 -> 7,6,5,4,3,2,1
print(list2[::-1])

print("-" * 20)
# 元组tuple
# 有序，元素可以重复，元素的类型可以不唯一，不可变的
# 定义
tuple2 = (1, 2, 2, "abc", 1.1, 3, 4, 5, 6)
print(tuple2, type(tuple2))
print(tuple2[2])
# tuple2[2] = "qwer"

# 声明只有一个元素的元组时 需要加上一个 逗号
tuple3 = (1)
print(tuple3, type(tuple3))
tuple4 = (1,)
print(tuple4, type(tuple4))

# ”不可变“ 实际上指的时 元组的每一个元素的指向不变
list3 = [1, 2, 3]
tuple5 = ("a", "b", list3)
print(tuple5, type(tuple5))

list3[0] = "xxxxxx"
print(tuple5)

# 字典dict
# 查找速度非常快 不会随着元素的增加 而延长查找时间
# 字典中的每一个元素都是 k-v格式的 类似于Java中的HashMap
# value 的类型可以任意
# key 的类型必须是不可变的，只有不可变的 才能进行hash，才能使查找速度不会受元素个数的影响
# 可变的：list dict set
# 不可变的：基本数据类型、tuple
# 无序的
# 定义
dict2 = {"k": "v"}
dict1 = {
    "k": "v",
    "k2": "v2",
    "k3": "v3",
    "k4": 1.1,
    "k5": {
        "kk5": "vv5"
    },
    "k6": [],
    "k7": (1, 2, 3),
    tuple2: "123",
    1: "abc",
    False: "122"
}
print(dict1, type(dict1))

# 修改元素
dict1["k"] = "vvvvvvvvv"
print(dict1)
# 取元素
print(dict1.get("kfff", "如果key不存在则返回"))
# print(dict1["kfff"]) # key不存在就报错

print("-" * 30)

# 集合set
# 无序、元素可以重复但会进行自动去重、元素的类型可以不唯一、可变的
# 定义
set1 = {1, 1, 1, 1, 2, 2, 2, 2, 2, 3, "abc", 1.1, False}
print(set1, type(set1))
# print(set1[0])

# dict3 = {set1:"111"}

set1.add(6)
print(set1)

# 类似数学上的集合 主要用于 交集、并集、补集......
